home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-PPC / CACHE.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  3KB  |  101 lines

  1. /*
  2.  * include/asm-ppc/cache.h
  3.  */
  4. #ifndef __ARCH_PPC_CACHE_H
  5. #define __ARCH_PPC_CACHE_H
  6.  
  7. #include <linux/config.h>
  8. #include <asm/processor.h>
  9. /*#include <asm/system.h>*/
  10.  
  11. /* bytes per L1 cache line */
  12. #define        L1_CACHE_BYTES  32      
  13. #define        L1_CACHE_ALIGN(x)       (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
  14. #define L1_CACHE_PAGES        8
  15.  
  16. #define        SMP_CACHE_BYTES L1_CACHE_BYTES
  17.  
  18. #if defined(__KERNEL__) && !defined(__ASSEMBLY__)
  19. extern void flush_dcache_range(unsigned long start, unsigned long stop);
  20.  
  21. static inline unsigned long unlock_dcache(void)
  22. {
  23. #ifndef CONFIG_8xx    
  24.     ulong hid0 = 0;
  25.     /* 601 doesn't do this */
  26.     if ( (ulong) _get_PVR() == 1 )
  27.         return 0;
  28.     asm("mfspr %0,1008 \n\t" : "=r" (hid0) );
  29.     if ( !(hid0 & HID0_DLOCK) )
  30.         return 0;
  31.     asm("mtspr 1008,%0 \n\t" :: "r" (hid0 & ~(HID0_DLOCK)));
  32.     return (hid0 & HID0_DLOCK) ? 1 : 0;
  33. #else /* ndef CONFIG_8xx */
  34.     return 0;
  35. #endif
  36. }
  37.  
  38. static inline void lock_dcache(unsigned long lockit)
  39. {
  40. #ifndef CONFIG_8xx
  41.     /* 601 doesn't do this */
  42.     if ( !lockit || ((ulong) _get_PVR() == 1) )
  43.         return;
  44.     asm("mfspr    %0,1008 \n\t"
  45.         "ori    %0,%0,%2 \n\t"
  46.         "mtspr    1008,%0 \n\t"
  47.         "sync \n\t isync \n\t"
  48.         : "=r" (lockit) : "0" (lockit), "i" (HID0_DLOCK));
  49. #endif /* ndef CONFIG_8xx */
  50. }
  51.  
  52. #endif /* __ASSEMBLY__ */
  53.  
  54. /* prep registers for L2 */
  55. #define CACHECRBA       0x80000823      /* Cache configuration register address */
  56. #define L2CACHE_MASK    0x03    /* Mask for 2 L2 Cache bits */
  57. #define L2CACHE_512KB    0x00    /* 512KB */
  58. #define L2CACHE_256KB    0x01    /* 256KB */
  59. #define L2CACHE_1MB    0x02    /* 1MB */
  60. #define L2CACHE_NONE    0x03    /* NONE */
  61. #define L2CACHE_PARITY  0x08    /* Mask for L2 Cache Parity Protected bit */
  62.  
  63. #ifdef CONFIG_8xx
  64. /* Cache control on the MPC8xx is provided through some additional
  65.  * special purpose registers.
  66.  */
  67. #define IC_CST        560    /* Instruction cache control/status */
  68. #define IC_ADR        561    /* Address needed for some commands */
  69. #define IC_DAT        562    /* Read-only data register */
  70. #define DC_CST        568    /* Data cache control/status */
  71. #define DC_ADR        569    /* Address needed for some commands */
  72. #define DC_DAT        570    /* Read-only data register */
  73.  
  74. /* Commands.  Only the first few are available to the instruction cache.
  75. */
  76. #define    IDC_ENABLE    0x02000000    /* Cache enable */
  77. #define IDC_DISABLE    0x04000000    /* Cache disable */
  78. #define IDC_LDLCK    0x06000000    /* Load and lock */
  79. #define IDC_UNLINE    0x08000000    /* Unlock line */
  80. #define IDC_UNALL    0x0a000000    /* Unlock all */
  81. #define IDC_INVALL    0x0c000000    /* Invalidate all */
  82.  
  83. #define DC_FLINE    0x0e000000    /* Flush data cache line */
  84. #define DC_SFWT        0x01000000    /* Set forced writethrough mode */
  85. #define DC_CFWT        0x03000000    /* Clear forced writethrough mode */
  86. #define DC_SLES        0x05000000    /* Set little endian swap mode */
  87. #define DC_CLES        0x07000000    /* Clear little endian swap mode */
  88.  
  89. /* Status.
  90. */
  91. #define IDC_ENABLED    0x80000000    /* Cache is enabled */
  92. #define IDC_CERR1    0x00200000    /* Cache error 1 */
  93. #define IDC_CERR2    0x00100000    /* Cache error 2 */
  94. #define IDC_CERR3    0x00080000    /* Cache error 3 */
  95.  
  96. #define DC_DFWT        0x40000000    /* Data cache is forced write through */
  97. #define DC_LES        0x20000000    /* Caches are little endian mode */
  98. #endif /* CONFIG_8xx */
  99.  
  100. #endif
  101.